"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/2/12 10:27
@Description :   数据容器的基本使用
常见数据容器：
   1. 变量
        计算机中的一段内存空间
        存储单个数据   如果有多个数据需要存储 则需要定义多个变量   频繁的定义变量会影响程序执行效率
        是否有一个容器可以同时存储多个数据？
   2. 列表   list
       在列表中可以存储多个数据
       如何定义列表
         []  空列表
         [元素,元素,元素,元素,元素,元素]
       特点：
          1.有序     索引  0  1  2  3  4  5  6  7  8  9  反向索引  -1  -2
          2.可重复
          3.不限定数据类型
   3. 元组
   4. 字典
   5. 集合
"""
# 存储一个学生成绩
score = 85
#  存储一个班级的学生成绩   <class 'list'>
score_list = [65, 80, 76, 87]
#  创建空列表
# score_list = []
# score_list = list()

print(score_list)
print(type(score_list))

# 如何添加数据到列表
'''
score_list.append(65)
score_list.append(80)
score_list.append(76)
score_list.append(87)
'''
#  修改指定索引位置的元素
score_list[0] = 100
score_list[1] = 90
score_list[2] = 80
score_list[3] = 70

print(score_list)

#  如何获取列表中的数据  索引  index  列表名[index]
score_list_item1 = score_list[0]
print(score_list_item1)
score_list_item2 = score_list[1]
print(score_list_item2)
score_list_item3 = score_list[2]
print(score_list_item3)
#  通过反向索引获取元素
score_list_item4 = score_list[-1]
print(score_list_item4)
score_list_item5 = score_list[-2]
print(score_list_item5)

#  IndexError: list index out of range
# score_list_item6 = score_list[6]
# print(score_list_item6)

# 获取列表中元素的个数  len()
len_list = len(score_list)
print(len_list)
print('*' * 30)
# 列表遍历  6   0-5
for index in range(len_list):
    print(score_list[index])

print('*' * 30)
#  将列表作为可迭代元素进行遍历
for score in score_list:
    print(score)
print('*' * 30)
'''
   列表切片 ： 通过索引获取一个区间内的元素
   列表[0]  获取索引为0的元素
   列表[start:end]   切片  [start,end)   默认步长 1
   列表[start:end:step]   切片  [start,end)   step 步长
'''
nums_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sub_numbs = nums_list[2:5]
print(sub_numbs)
sub_numbs = nums_list[0:7:2]
print(sub_numbs)
#  切片参数的缺省写法  参数1缺失 index = 0
sub_numbs = nums_list[:7]
print(sub_numbs)
#  切片参数的缺省写法  参数2缺失 index = len -1
sub_numbs = nums_list[1:]
print(sub_numbs)
# 两个参数均缺失  获取全部元素
sub_numbs = nums_list[:]
print(sub_numbs)

sub_numbs = nums_list[1::3]
print(sub_numbs)

sub_numbs = nums_list[::3]
print(sub_numbs)

# 学生成绩列表   计算平均成绩
score_list = [65, 80, 76, 87, 98]

sum = 0
for score in score_list:
    sum += score

print(f'学生成绩的平均分是:{sum // len(score_list)}')

print('*' * 30)
'''
   列表的其它常见操作

'''
list_items1 = [1, 2, 3, 'hello', True]
list_items2 = [4, 5, 6]

list_result = list_items1 + list_items2
print(list_result)

list_items1 = ['a', 'b', 'c']
list_result = list_items1 * 4
print(list_result)
# 成员运算
list_result = 4 in list_items1
print(list_result)

#  通过python中内置函数  操作列表
print(f'{list_items2}中的最大值是:{max(list_items2)}')
print(f'{list_items2}中的最小值是:{min(list_items2)}')
print(f'{list_items2}的长度是:{len(list_items2)}')

'''
  list类型数据本身内置的操作

'''
list_items2 = [1, 4, 1, 1, 5, 6]
# 列表末尾追加元素
list_items2.append(7)
print(list_items2)
# 统计指定元素在列表中出现的次数
count = list_items2.count(1)
print(f'1在列表{list_items2}中出现的次数是:{count}')
#  移除列表末尾的元素
# item = list_items2.pop()
list_items2.remove(1)
print(list_items2)
#  翻转列表中的元素
list_items2.reverse()
print(list_items2)
print('*' * 30)
#  复制列表   会生成新列表
'''
list_items2_cp = list_items2.copy()
list_items2_cp[0] = 0
print(list_items2, id(list_items2))
print(list_items2_cp, id(list_items2_cp))
'''

print('*' * 30)

#  将列表的内存地址复制给新变量  两个变量同时指向一个列表
'''
list_items2_cp2 = list_items2
list_items2_cp2[0] = 0
print(list_items2, id(list_items2))
print(list_items2_cp2, id(list_items2_cp2))
'''

# 在指定索引位置插入一个元素
list_items2 = [0]
print(list_items2)

list_items2.insert(2, 1)
print(list_items2)
#  可以一次将一个新列表中的元素添加到列表中
list_items2.extend(['hello', 'world', 'hello', 'world'])
print(list_items2)
#  获取指定元素在列表中的索引
# item_index = list_items2.index('hello', 3)


# ValueError: 'h' is not in list
# item_index = list_items2.index('h')
# print(item_index)

# 清空列表
# list_items2.clear()
# print(list_items2)

# 排序
list_items2 = [1, 3, 2, 6, 5, 4, 7]
# reverse=True 倒序
list_items2.sort(reverse=True)
print(list_items2)
